package com.chianghao.rockframewrok.auth.core.token.model;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.chianghao.rockframewrok.auth.cache.model.User;

public class JWTToken implements Token {

	/**
	 * jwt签发者
	 */
	private String iss;
	/**
	 * jwt所面向的用户
	 */
	private String sub;
	/**
	 * 接收jwt的一方
	 */
	private List<String> aud;
	/**
	 * jwt的过期时间，这个过期时间必须要大于签发时间
	 */
	private Date exp;
	/**
	 * 定义在什么时间之前，该jwt都是不可用的.
	 */
	private Date nbf;
	/**
	 * jwt的签发时间
	 */
	private Date iat;
	/**
	 * jwt的唯一身份标识，主要用来作为一次性token,从而回避重放攻击。
	 */
	private String jti;

	/**
	 * 其他信息
	 */
	private Map<String,String> claimMap = new HashMap<String,String>();
	
	
	public Map<String,String> getCliaimMap(){
		return this.claimMap;
	}
	
	
	public String getClaim(String name) {
		return claimMap.get(name);
	}
	
	public void setClaim(String name,String value) {
		this.claimMap.put(name, value);
	}
	@Override
	public String getUserKey() {
		return sub;
	}

	@Override
	public String getId() {
		return jti;
	}

	public String getIss() {
		return iss;
	}

	public void setIss(String iss) {
		this.iss = iss;
	}

	public String getSub() {
		return sub;
	}

	public void setSub(String sub) {
		this.sub = sub;
	}

	public List<String> getAud() {
		return aud;
	}

	public void setAud(List<String> aud) {
		this.aud = aud;
	}

	public Date getNbf() {
		return nbf;
	}

	public void setNbf(Date nbf) {
		this.nbf = nbf;
	}
	
	public Date getExp() {
		return exp;
	}

	public void setExp(Date exp) {
		this.exp = exp;
	}

	public Date getIat() {
		return iat;
	}

	public void setIat(Date iat) {
		this.iat = iat;
	}

	public String getJti() {
		return jti;
	}

	public void setJti(String jti) {
		this.jti = jti;
	}


	public User getUser() {
		if(StringUtils.isEmpty(sub)) {
			return null;
		}
		return new User() {
			@Override
			public String getKey() {
				return sub;
			}};
	}


	@Override
	public Long getExpTime() {
		if(this.exp==null){
			return null;
		}
		return this.exp.getTime();
	}

}
